#ifndef AABB_H
#define AABB_H

#include <ToolBox/vectorf.h>

#include <DirectLOL/CollisionDetection/boundingShape.h>
#include <DirectLOL/CollisionDetection/boundingsphere.h>
#include "DirectLOL/graphicElement/graphicElement.h"

/*!
 *  \class AABB
 *  \brief Représente une Axis Aligned Bounding Box, ou boite englobante aligné sur les axes.
 *
 *  \details Ce type d'objet sert à simplifier le problème que pose la détection de collision
 *          en définissant une boite qui va être utilisé pour circonscrire tous les sommets d'une
 *          structure plus complexe (maillage) pouvant potentiellement contenir des milliers de triangles
 *
 *              *---------------------*               y +
 *             /|               max  /|               |
 *            *--------------------(+)|               | / z -
 *            | | min               | |               |/
 *            |(-)------------------|-*               *----- x  (+)
 *            |/                    |/
 *            *---------------------*
 *
 */

class AABB : public BoundingShape
{
    public:

    Vectorf * min;  /*!< Représente le sommet "min" de la boite */
    Vectorf * max;  /*!< Représente le sommet "max" de la boite */

    /*!
     *  \brief Constructeur
     *  \details  Construit la boite englobante à partir d'un objet graphique (donc composé obligatoirement de sommets )
     *            cette méthode va parcourir l'ensemble des sommets de l'élément passé en paramètre pour ensuite définir la taille
     *            de la boite englobante correspondante
     *
     *  \param GraphicElement element  Elément graphique à partir duquel on va définir la taille et la position de la boite englobante
     */

    AABB(GraphicElement * element);

    /*!
     *  \brief Constructeur
     *  \details  Construit la boite englobante à partir des sommets min et max défini par l'utilisateur, la position de la
     *            boite étant par défault défini à l'origine (0,0,0)

     *  \param Vectorf aMin  Sommet "min" de la boite
     *  \param Vectorf aMax  Sommet "max" de la boite
     */

    AABB(Vectorf * aMin, Vectorf * aMax);

    /*!
     *  \brief Constructeur
     *  \details  Construit la boite englobante à partir des sommets min et max ainsi que de la position de la boite englobante
     *
     *  \param Vectorf aMin  Sommet "min" de la boite
     *  \param Vectorf aMax  Sommet "max" de la boite
     *  \param Vectorf aTranslation Position de la boite englobante dans la scène
     */

    AABB(Vectorf * aMin, Vectorf * aMax, Vectorf * aTranslation);

    /*!
     *  \brief Défini les dimensions de la boite englobante à partir d'un objet graphique potentiellement complexe
     *
     *  \param GraphicElement element  Elément graphique à partir duquel on va définir les dimensions
     *         ainsi que la position de la boite englobante
     */

    void DefineAABB(GraphicElement *);

    int IsUp(AABB * aVertex);
    int IsDown(AABB * aVertex);
    int IsFront(AABB* aVertex);
    int IsBack(AABB * aVertex);
    int IsRight(AABB * aVertex);
    int IsLeft(AABB * aVertex);

};

#endif // AABB_H
